package config

import (
	"net/url"
	"strconv"
)

type Mysql struct {
	Host     string `yaml:"host" `
	Port     int    `yaml:"port" `
	Config   string `yaml:"config" ` // 高级配置，例如charset
	DB       string `yaml:"db" `
	User     string `yaml:"user" `
	Password string `yaml:"password" `
	Loc      string `yaml:"loc" `
	LogLevel string `yaml:"log_level" ` //日志等级，debug为输出全部sql
}

func (m Mysql) Dsn() string {
	// URL encode loc
	loc := url.QueryEscape(m.Loc) // 例如 Asia/Shanghai -> Asia%2FShanghai

	// 拼接配置参数，如果 m.Config 为空，可以默认赋值 charset=utf8mb4
	config := m.Config
	if config == "" {
		config = "?charset=utf8mb4&parseTime=True&loc=" + loc
	} else {
		// 如果 m.Config 已经有参数，先判断是否以 ? 开头，没有则加上，再拼 loc 和 parseTime
		if config[0] != '?' {
			config = "?" + config
		}
		// 这里为了安全，强制添加 parseTime 和 loc
		if !contains(config, "parseTime") {
			config += "&parseTime=True"
		}
		if !contains(config, "loc") {
			config += "&loc=" + loc
		}
	}

	return m.User + ":" + m.Password + "@tcp(" + m.Host + ":" + strconv.Itoa(m.Port) + ")/" + "rjgchpublic_db" + config
}

// 简单判断字符串包含的辅助函数
func contains(s, substr string) bool {
	return len(s) >= len(substr) && (len(s) == len(substr) && s == substr || len(s) > len(substr) && (s[0:len(substr)] == substr || contains(s[1:], substr)))
}
